/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package semantica.tipos;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author Javi
 */
public class TipoProc extends Tipo{
            
    ArrayList <ContenidoProc> campos;
    
    public TipoProc (ArrayList <ContenidoProc> c){
        this.tipo = "proc";
        this.campos = new ArrayList<ContenidoProc>(c);
        this.tam = tamProc(campos);
    }
    
    private int tamProc(ArrayList<ContenidoProc> campos) {
        int tamProc = 0;
        Iterator<ContenidoProc> it = campos.iterator();
        while (it.hasNext()){
            ContenidoProc c  = it.next();
            if (c.getModo().equals("var")) tamProc += 1;
            else tamProc += c.getTipo().tam;
        }
        return tamProc;
    }
    
    public ArrayList<ContenidoProc> getCampos(){
        return campos;
    }
    
    public String muestraCampos(){
        Iterator<ContenidoProc> it = campos.iterator();
        String s = "[ ";
        while(it.hasNext()){
            ContenidoProc c = it.next();
            s += " < id: " + c.getId() + ", modo: " + c.getModo() + muestraTipo(c.getTipo()) 
                    + "> , desp: " + c.getDesp() + ">, ";
        }
        return s.substring(0, s.length()-1) + "]";
    }
    
    public Tipo dameTipoPorId(String id){
        Iterator<ContenidoProc> it = campos.iterator();
        while(it.hasNext()){
            ContenidoProc c = it.next();
            if (id.equals(c.getId())) return c.getTipo();
        }
        return new TipoError();
    }
    
    
    public String muestraTipo(Tipo tipo){
        String mostrar = "";
        String nombreTipo = tipo.getTipo();
        if (nombreTipo.equals("natural") || nombreTipo.equals("integer") || nombreTipo.equals("float") || 
                nombreTipo.equals("character") || nombreTipo.equals("boolean"))
                mostrar += ", tipo: <t: " + nombreTipo + ", tam: " + tipo.getTam();
        else if (nombreTipo.equals("array")){
              mostrar += ", tipo: <t: " + tipo.getTipo() + ", nelems: " + ((TipoArray)tipo).getNumElem()
                      + ", tbase: ";
              Tipo tb = ((TipoArray) tipo).getTipoBase();
              if (tb.getTipo().equals("ref"))
                  mostrar += "< t: ref " + ", id: " + ((TipoIdentificador)tb).getId() + ", tam: " +((TipoIdentificador)tb).getTam();
              else if (tb.getTipo().equals("array"))
                  mostrar += "< t: array , nelems: " + ((TipoArray)tb).getNumElem() + 
                              ", tbase: " + ((TipoArray)tb).getTipoBase().getTipo() + 

                              ", tam: " + ((TipoArray)tb).getTam() +
                              "> , tam: " + ((TipoArray)tipo).getTam()  ;

        } else if (tipo.getTipo().equals("tupla"))
              mostrar += " tipo: <t: " + tipo.getTipo() + ", campos:" + ((TipoTupla)tipo).muestraCampos() + ", tam: " + ((TipoTupla)tipo).getTam();   
        else if (tipo.getTipo().equals("ref")){
              mostrar += ", tipo: <t: " + tipo.getTipo() + ", id: " + ((TipoIdentificador)tipo).getId() + ", tam: " + ((TipoIdentificador)tipo).getTam();
           } 
        return mostrar;
    }
   
}